﻿// 皇宫看守.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>

using namespace std;

/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1579
https://loj.ac/p/10157
太平王世子事件后，陆小凤成了皇上特聘的御前一品侍卫。

皇宫以午门为起点，直到后宫嫔妃们的寝宫，呈一棵树的形状，某些宫殿间可以互相望见。大内保卫森严，三步一岗，五步一哨，
每个宫殿都要有人全天候看守，在不同的宫殿安排看守所需的费用不同。

可是陆小凤手上的经费不足，无论如何也没法在每个宫殿都安置留守侍卫。

帮助陆小凤布置侍卫，在看守全部宫殿的前提下，使得花费的经费最少。



【输入】
输入中数据描述一棵树，描述如下：

第一行 n，表示树中结点的数目。

第二行至第 n+1行，每行描述每个宫殿结点信息，依次为：该宫殿结点标号 i(0<i≤n)
，在该宫殿安置侍卫所需的经费 k，该边的儿子数 m
，接下来 m 个数，分别是这个节点的 m个儿子的标号r1,r2,⋯,rm。

对于一个 n个结点的树，结点标号在 1到 n之间，且标号不重复。

【输出】
输出最少的经费

【输入样例】
6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0
【输出样例】
25

样例解释：

有六个区域被安排的情况如左图所示。

如右图，灰色点安排了警卫，2号警卫可以观察 1,2,5,6
，3号警卫可以观察 1,3
，4号警卫可以观察 1,4。

总费用：16+5+4=25

数据范围与提示：
对于 100% 的数据，0<n≤1500。


17
1 2 3 2 3 4
2 3 1 5
3 1 2 6 7
4 1 1 8
5 1 0
6 3 2 9 10
7 3 1 11
8 3 2 12 13
9 1 0
10 1 0
11 1 0
12 1 0
13 1 1 14
14 1 1 15
15 1 1 16
16 2 1 17
17 1 0

*/


const int N = 1510, M = N * 2;
int h[N], e[M], w[M], ne[M], idx;
int val[N];
int n;
int dp[N][3]; //三种情况 未放 未被监控 0   未放被监控  1   放了被监控 2

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int x, int father) {
	dp[x][0] = 0;
	dp[x][2] = val[x];


	for (int i = h[x]; i != -1; i = ne[i]) {
		int j = e[i];
		if (j == father) continue;
		dfs(j, x);
		dp[x][2] += min(dp[j][2], min(dp[j][1], dp[j][0]));
		dp[x][0] += dp[j][1]; dp[x][0] = min(0x3f3f3f3f, dp[x][0]);
		//sum += dp[j][1];
	}

	if (-1 == father && h[x] != -1) {
		dp[x][1] = 0;
	}
	else if (-1 != father && ne[h[x]] != -1) {
		dp[x][1] = 0;
	}
	else {
		return;
	}

	int val = 0x3f3f3f3f; 	 int flag = 0;
	for (int i = h[x]; i != -1; i = ne[i]) {
		int j = e[i];
		if (j == father) continue;
		if (dp[j][1] < 0x3f3f3f3f && dp[j][1] < dp[j][2]) {
			dp[x][1] += dp[j][1];
			val = min(val,dp[j][2] - dp[j][1]);
		}
		else {
			dp[x][1] += dp[j][2]; flag = 1;
		}
	}
	
	if (0 == flag) {
		dp[x][1] += val;
	}


}



int main()
{
	memset(h, -1, sizeof h);
	memset(dp, 0x3f, sizeof dp);
	cin >> n;
	for (int i = 0; i < n; i++) {
		int a, c, t, b;
		cin >> a >> c >> t;
		val[a] = c;
		for (int j = 0; j < t; j++) {
			cin >> b;
			add(a, b, c); add(b, a, c);
		}
	}

	dfs(1, -1);

	cout << min(dp[1][1], dp[1][2]) << endl;

	return 0;
}

